package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ITransferAccountInfoDAO;
import org.jsola.hr.dto.TransferAccountInfoAddDTO;
import org.jsola.hr.dto.TransferAccountInfoUpdateDTO;
import org.jsola.hr.entity.TransferAccountInfoDO;
import org.jsola.hr.query.TransferAccountInfoQuery;
import org.jsola.hr.vo.TransferAccountInfoListVO;
import org.jsola.hr.vo.TransferAccountInfoVO;
import org.jsola.hr.vo.payWx.VxBuildUserToken;
import org.jsola.hr.vo.payWx.VxWgkUserAuthResultVO;
import org.jsola.hr.vo.payWx.checkFace.VxCheckFaceReturnVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 转账账户库
 *
 * @author zhr
 */
public interface ITransferAccountInfoService extends IService<ITransferAccountInfoDAO, TransferAccountInfoDO> {

    /**
     * 新增转账账户库
     * @param transferAccountInfoAddDTO 新增转账账户库DTO
     * @param tokenUser 当前用户
     * @return 转账账户库详情信息
     */
    TransferAccountInfoVO save(TransferAccountInfoAddDTO transferAccountInfoAddDTO, TokenUser tokenUser);

    /**
     * 修改转账账户库
     * @param transferAccountInfoUpdateDTO 修改转账账户库DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(TransferAccountInfoUpdateDTO transferAccountInfoUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除转账账户库，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param transferAccountInfoIds 转账账户库id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...transferAccountInfoIds);

    /**
     * 根据转账账户库id查找
     * @param transferAccountInfoId 转账账户库id
     * @param siteId 所属站点id
     * @return 转账账户库详情信息
     */
    TransferAccountInfoVO selectById(String transferAccountInfoId, String siteId);

    /**
     * 查询转账账户库
     * @param transferAccountInfoQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账账户库列表信息
     */
    List<TransferAccountInfoListVO> select(TransferAccountInfoQuery transferAccountInfoQuery, String siteId);

    /**
    * 查询转账账户库记录数
    * @param transferAccountInfoQuery 查询条件
    * @param siteId 所属站点id
    * @return 转账账户库记录数
    */
    int selectCount(TransferAccountInfoQuery transferAccountInfoQuery, String siteId);

    /**
     * 分页查询转账账户库
     * @param transferAccountInfoQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账账户库列表信息
     */
    Page<TransferAccountInfoListVO> selectPage(TransferAccountInfoQuery transferAccountInfoQuery, String siteId);


    /**
     * 根据转账账户库id查找
     * @param transferAccountInfoId 转账账户库id
     * @param siteId 所属站点id
     * @return 转账账户库
     */
    TransferAccountInfoDO selectDOById(String transferAccountInfoId, String siteId);

    /**
     * 查询转账账户库
     * @param transferAccountInfoQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账账户库列表
     */
    List<TransferAccountInfoDO> selectDO(TransferAccountInfoQuery transferAccountInfoQuery, String siteId);

    /**
     * 根据siteId和类型查询账户信息
     * @param siteId 租户id
     * @param type 账户类型：1:支付宝，2：微信，3：银行
     * @return 账户List
     */
    List<TransferAccountInfoDO> selectBySiteIdAndType(String siteId, Integer type);

    /**
     * 根据siteId和类型查询账户信息
     * @param siteId 租户id
     * @param name 账户名称
     * @return 账户List
     */
    List<TransferAccountInfoDO> selectByName(String siteId, String name);

    /**
     * 查询租户的微信账户余额（查询到结果会修改账户表的余额信息）
     * @param siteId 租户id
     * @return 租户账户List
     */
    List<TransferAccountInfoVO> selectVxAccountMoney(String siteId);

    /**
     * 根据 siteId、类型、具体的账号 查询账户信息
     * @param type 账户类型：1:支付宝，2：微信，3：银行
     * @param account 账号（支付宝对应的是支付宝的pid，微信对应的是微信特约商户号， 银行对应的是银行账户）
     * @param siteId 租户id
     * @return 账户List
     */
    TransferAccountInfoDO selectBySiteIdAndAccount(Integer type, String account, String siteId);

    /**
     * 根据 类型、具体的账号 查询账户信息
     * @param type 账户类型：1:支付宝，2：微信，3：银行
     * @param account 账号（支付宝对应的是支付宝的pid，微信对应的是微信特约商户号， 银行对应的是银行账户）
     * @return 账户List
     */
    TransferAccountInfoDO selectByTypeAndAccount(Integer type, String account);

    /**
     * 生成支付宝签约链接
     * @param loginId 支付宝登录账号
     * @return 签约链接
     */
    String generateZfbSignUrl(String loginId);

    /**
     * 根据账户id 生成安全发需要的记账本(同步保存记账本id)
     * @param transferAccountInfoId 账户id
     * @param tokenUser 当前用户
     * @return 记账本id
     */
    String generateZfbSafetyPayAccountBook(String transferAccountInfoId, TokenUser tokenUser);

    /**
     * 查询租户的支付宝安全发账户余额（查询到结果会修改账户表的余额信息）
     * @param siteId 租户id
     * @return 租户账户List
     */
    List<TransferAccountInfoVO> selectZfbSafetyAccountMoney(String siteId);

    /**
     * 生成支付宝付款链接(向记账本里面充值的链接)
     * @param transferAccountInfoId 账户id
     * @param money 充值金额
     * @param tokenUser 当前用户
     * @return 签约链接
     */
    String generateZfbMoneyToBookUrl(String transferAccountInfoId, Double money, TokenUser tokenUser);

    /**
     * 根据类型查询账户
     * @param type 账户类型
     * @param siteId 租户id
     * @return 账户list
     */
    List<TransferAccountInfoDO> selectListByType(Integer type, String siteId);

    /**
     * 查询用户授权状态
     * @param openId openid
     * @param siteId 租户id
     * @return 授权状态
     */
    VxWgkUserAuthResultVO selectUserAuthStatus(String openId, String siteId);

    /**
     * 微工卡 生成授权token
     * @param vxBuildUserToken 生成token需要的参数
     * @param siteId 租户id
     * @return token
     */
    VxCheckFaceReturnVO buildAuthToken(VxBuildUserToken vxBuildUserToken, String siteId);

    /**
     * 查询租户的平安银行账户余额（查询到结果会修改账户表的余额信息）
     * @param siteId 租户id
     * @return 租户账户List
     */
    List<TransferAccountInfoVO> selectPingAnBankAccountMoney(String siteId);


}


